home *** CD-ROM | disk | FTP | other *** search
/ NOVA - For the NeXT Workstation / NOVA - For the NeXT Workstation.iso / Apps / ArchiveUtils / tar / mangle_test.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-12-20  |  5.5 KB  |  251 lines

  1. #include <sys/types.h>
  2. #include <sys/stat.h>
  3. #include "tar.h"
  4.  
  5. #ifdef __STDC__
  6. #define VOIDSTAR void *
  7. #else
  8. #define VOIDSTAR char *
  9. #endif
  10. extern VOIDSTAR ck_malloc();
  11. extern VOIDSTAR init_buffer();
  12. extern char *quote_copy_string();
  13. extern char *get_buffer();
  14. extern char *index();
  15.  
  16. extern union record *start_header();
  17.  
  18. extern struct stat hstat;        /* Stat struct corresponding */
  19.  
  20. struct mangled {
  21.     struct mangled *next;
  22.     int type;
  23.     char mangled[NAMSIZ];
  24.     char *linked_to;
  25.     char normal[1];
  26. };
  27.  
  28.  
  29. /* Should use a hash table, etc. .  */
  30. struct mangled *first_mangle;
  31. int mangled_num = 0;
  32.  
  33. char *
  34. find_mangled (name)
  35. char *name;
  36. {
  37.     struct mangled *munge;
  38.  
  39.     for(munge=first_mangle;munge;munge=munge->next)
  40.         if(!strcmp(name,munge->normal))
  41.             return munge->mangled;
  42.     return 0;
  43. }
  44.  
  45.  
  46. #ifdef S_IFLNK
  47. void add_symlink_mangle(symlink, linkto, buffer)
  48. char *symlink;
  49. char *linkto;
  50. char *buffer;
  51. {
  52.     struct mangled *munge,*kludge;
  53.  
  54.     munge=(struct mangled *)ck_malloc(sizeof(struct mangled)+strlen(symlink)+strlen(linkto)+2);
  55.     if(!first_mangle)
  56.         first_mangle=munge;
  57.     else {
  58.         for(kludge=first_mangle;kludge->next;kludge=kludge->next)
  59.             ;
  60.         kludge->next=munge;
  61.     }
  62.     munge->type=1;
  63.     munge->next=0;
  64.     strcpy(munge->normal,symlink);
  65.     munge->linked_to=munge->normal+strlen(symlink)+1;
  66.     strcpy(munge->linked_to,linkto);
  67.     sprintf(munge->mangled,"@@MaNgLeD.%d",mangled_num++);
  68.     strncpy(buffer,munge->mangled,NAMSIZ);
  69. }
  70. #endif
  71.  
  72. void
  73. add_mangle (name, buffer)
  74. char *name;
  75. char *buffer;
  76. {
  77.     struct mangled *munge,*kludge;
  78.  
  79.     munge=(struct mangled *)ck_malloc(sizeof(struct mangled)+strlen(name));
  80.     if(!first_mangle)
  81.         first_mangle=munge;
  82.     else {
  83.         for(kludge=first_mangle;kludge->next;kludge=kludge->next)
  84.             ;
  85.         kludge->next=munge;
  86.     }
  87.     munge->next=0;
  88.     munge->type=0;
  89.     strcpy(munge->normal,name);
  90.     sprintf(munge->mangled,"@@MaNgLeD.%d",mangled_num++);
  91.     strncpy(buffer,munge->mangled,NAMSIZ);
  92. }
  93.  
  94. void
  95. write_mangled()
  96. {
  97.     struct mangled *munge;
  98.     struct stat hstat;
  99.     union record *header;
  100.     char *ptr1,*ptr2;
  101.     VOIDSTAR the_buffer;
  102.     int size;
  103.     int bufsize;
  104.     /* PEC 7-29-91 */
  105.     extern char *save_name;
  106.     extern long save_totsize;
  107.     extern long save_sizeleft;
  108.     /* PEC 7-29-91 */
  109.  
  110.     if(!first_mangle)
  111.         return;
  112.     the_buffer=init_buffer();
  113.     for(munge=first_mangle,size=0;munge;munge=munge->next) {
  114.         ptr1=quote_copy_string(munge->normal);
  115.         if(!ptr1)
  116.             ptr1=munge->normal;
  117.         if(munge->type) {
  118.             add_buffer(the_buffer,"Symlink ",8);
  119.             add_buffer(the_buffer,ptr1,strlen(ptr1));
  120.             add_buffer(the_buffer," to ",4);
  121.             
  122.             if(ptr2=quote_copy_string(munge->linked_to)) {
  123.                 add_buffer(the_buffer,ptr2,strlen(ptr2));
  124.                 free(ptr2);
  125.             } else
  126.                 add_buffer(the_buffer,munge->linked_to,strlen(munge->linked_to));
  127.         } else {
  128.             add_buffer(the_buffer,"Rename ",7);
  129.             add_buffer(the_buffer,munge->mangled,strlen(munge->mangled));
  130.             add_buffer(the_buffer," to ",4);
  131.             add_buffer(the_buffer,ptr1,strlen(ptr1));
  132.         }
  133.         add_buffer(the_buffer,"\n",1);
  134.         if(ptr1!=munge->normal)
  135.             free(ptr1);
  136.     }
  137.  
  138.     bzero(&hstat,sizeof(struct stat));
  139.     hstat.st_atime=hstat.st_mtime=hstat.st_ctime=time(0);
  140.     ptr1=get_buffer(the_buffer);
  141.     hstat.st_size=strlen(ptr1);
  142.  
  143.     header=start_header("././@MaNgLeD_NaMeS",&hstat);
  144.     header->header.linkflag=LF_NAMES;
  145.     finish_header(header);
  146.     size=hstat.st_size;
  147.     /* multi-volume fix PEC 7-29-91 */
  148.     if(f_multivol) {
  149.         save_totsize = hstat.st_size;
  150.         save_name = "././@MaNgLeD_NaMeS";
  151.         save_sizeleft = hstat.st_size;
  152.     }
  153.     /* end PEC 7-29-91 */
  154.     header=findrec();
  155.     bufsize = endofrecs()->charptr - header->charptr;
  156.  
  157.     while(bufsize<size) {
  158.         bcopy(ptr1,header->charptr,bufsize);
  159.         ptr1+=bufsize;
  160.         size-=bufsize;
  161.         userec(header+(bufsize-1)/RECORDSIZE);
  162.         /* PEC 7-29-91 */
  163.         if(f_multivol) {
  164.             save_sizeleft = size;
  165.         }
  166.         /* end PEC 7-29-91 */
  167.         header=findrec();
  168.         bufsize = endofrecs()->charptr - header->charptr;
  169.     }
  170.     /* PEC 7-29-91 added check for size > 0 */
  171.     if(size > 0) {
  172.         bcopy(ptr1,header->charptr,size);
  173.         bzero(header->charptr+size,bufsize-size);
  174.         userec(header+(size-1)/RECORDSIZE);
  175.     }
  176.     /* PEC 7-29-91 */
  177.     if(f_multivol)
  178.         save_name = 0;
  179.     /* end PEC 7-29-91 */
  180. }
  181.  
  182. void
  183. extract_mangle(head)
  184. union record *head;
  185. {
  186.     char *buf;
  187.     char *fromtape;
  188.     char *to;
  189.     char *ptr,*ptrend;
  190.     char *nam1,*nam1end;
  191.     int size;
  192.     int copied;
  193.  
  194.     size=hstat.st_size;
  195.     buf=to=ck_malloc(size+1);
  196.     buf[size]='\0';
  197.     while(size>0) {
  198.         fromtape=findrec()->charptr;
  199.         if(fromtape==0) {
  200.             msg("Unexpected EOF in mangled names!");
  201.             return;
  202.         }
  203.         copied=endofrecs()->charptr-fromtape;
  204.         if(copied>size)
  205.             copied=size;
  206.         bcopy(fromtape,to,copied);
  207.         to+=copied;
  208.         size-=copied;
  209.         userec((union record *)(fromtape+copied-1));
  210.     }
  211.     for(ptr=buf;*ptr;ptr=ptrend) {
  212.         ptrend=index(ptr,'\n');
  213.         *ptrend++='\0';
  214.  
  215.         if(!strncmp(ptr,"Rename ",7)) {
  216.             nam1=ptr+7;
  217.             nam1end=index(nam1,' ');
  218.             while(strncmp(nam1end," to ",4)) {
  219.                 nam1end++;
  220.                 nam1end=index(nam1end,' ');
  221.             }
  222.             *nam1end='\0';
  223.             if(ptrend[-2]=='/')
  224.                 ptrend[-2]='\0';
  225.             un_quote_string(nam1end+4);
  226.             if(rename(nam1,nam1end+4))
  227.                 msg_perror("Can't rename %s to %s",nam1,nam1end+4);
  228.             else if(f_verbose)
  229.                 msg("Renamed %s to %s",nam1,nam1end+4);
  230.         }
  231. #ifdef S_IFLNK
  232.         else if(!strncmp(ptr,"Symlink ",8)) {
  233.             nam1=ptr+8;
  234.             nam1end=index(nam1,' ');
  235.             while(strncmp(nam1end," to ",4)) {
  236.                 nam1end++;
  237.                 nam1end=index(nam1end,' ');
  238.             }
  239.             un_quote_string(nam1);
  240.             un_quote_string(nam1end+4);
  241.             if(symlink(nam1,nam1end+4) && (unlink(nam1end+4) || symlink(nam1,nam1end+4)))
  242.                 msg_perror("Can't symlink %s to %s",nam1,nam1end+4);
  243.             else if(f_verbose)
  244.                 msg("Symlinkd %s to %s",nam1,nam1end+4);
  245.         }
  246. #endif
  247.         else
  248.             msg("Unknown demangling command %s",ptr);
  249.     }
  250. }
  251.